﻿// 181. 回转游戏.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>

using namespace std;

/*
https://www.acwing.com/problem/content/183/
如下图所示，有一个 # 形的棋盘，上面有 1,2,3 三种数字各 8 个。

给定 8 种操作，分别为图中的 A∼H。

这些操作会按照图中字母和箭头所指明的方向，把一条长为 7 的序列循环移动 1 个单位。

例如下图最左边的 # 形棋盘执行操作 A 后，会变为下图中间的 # 形棋盘，再执行操作 C 后会变成下图最右边的 # 形棋盘。

给定一个初始状态，请使用最少的操作次数，使 # 形棋盘最中间的 8 个格子里的数字相同。

2286_1.jpg

输入格式
输入包含多组测试用例。

每个测试用例占一行，包含 24 个数字，表示将初始棋盘中的每一个位置的数字，按整体从上到下，同行从左到右的顺序依次列出。

输入样例中的第一个测试用例，对应上图最左边棋盘的初始状态。

当输入只包含一个 0 的行时，表示输入终止。

输出格式
每个测试用例输出占两行。

第一行包含所有移动步骤，每步移动用大写字母 A∼H 中的一个表示，字母之间没有空格，如果不需要移动则输出 No moves needed。

第二行包含一个整数，表示移动完成后，中间 8 个格子里的数字。

如果有多种方案，则输出字典序最小的解决方案。

输入样例：
1 1 1 1 3 2 3 2 3 1 3 2 2 3 1 2 2 2 3 1 2 1 3 3
1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3
0
输出样例：
AC
2
DDHH
2
*/
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 24;
int op[8][7] = {
	{0,2,6,11,15,20,22},
	{1,3,8,12,17,21,23},
	{10,9,8,7,6,5,4},
	{19,18,17,16,15,14,13},
	{23,21,17,12,8,3,1},
	{22,20,15,11,6,2,0},
	{13,14,15,16,17,18,19},
	{4,5,6,7,8,9,10},
};

int opposite[8] = { 5,4,7,6,1,0,3,2 };
int center[8] = { 6,7,8,11,12,15,16,17 };

int q[N];
int path[100];

int f() {
	int sum[4] = { 0 };
	for (int i = 0; i < 8; i++) sum[q[center[i]]]++;
	int s = 0;
	for (int i = 1; i <= 3; i++) s = max(sum[i], s);

	return 8 - s;
}

void operate(int x) {
	int t = q[op[x][0]];
	for (int i = 0; i < 6; i++) q[op[x][i]] = q[op[x][i + 1]];
	q[op[x][6]] = t;
}

bool dfs(int depth, int max_depth, int last) {
	if (depth + f() > max_depth) return false;
	if (f() == 0) return true;

	for (int i = 0; i < 8; i++) {
		if (i != opposite[last]) {
			operate(i);
			path[depth] = i;
			if (dfs(depth + 1, max_depth, i)) return  true;
			operate(opposite[i]);
		}
	}

	return false;
}

int main()
{
	while (cin >> q[0], q[0]) {
		for (int i = 1; i < N; i++) cin >> q[i];
		int depth = 0;
		while (!dfs(0, depth, -1)) depth++;
		if (!depth) printf("No moves needed");
		else {
			for (int i = 0; i < depth; i++) printf("%c", path[i] + 'A');
		}
		printf("\n%d\n", q[6]);
	}


	return 0;
}